package TCP04;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

/**
 * @author 宋鑫宇
 * @version 1.0
 * 使用Socket 编写服务端,接收数据
 *    实现可以同时接收多个客户端的消息
 *      用线程池优化接收消息占用过多资源的问题
 *          一对一转发数据到指定客户端或者群发
 */
public class ServiceDemo2 {
    //使用静态变量创建一个线程池
    protected static ExecutorService pool = new ThreadPoolExecutor(3,5,5,
            TimeUnit.SECONDS,new ArrayBlockingQueue<>(3),
            Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
    //定义一个静态List集合存储当前全部链接上的socket管道
    public static List<Socket> list = new ArrayList<>();
    public static void main(String[] args) throws Exception {

        //1.注册端口,端口号必须和客户端一致
        ServerSocket ss = new ServerSocket(7777);

        //2.必须调用 accept 方法，等待接收客户端连接请求，建立Socket通信管道
        // a.如果实现接收多个客户端消息需要创建多个线程来并发
        //  定义一个死循环不断接收Socket管道连接
        Socket accept = null;
        while (true) {
            //b.每接收到一个客户端Socket管道，交给线程池的子线程负责读取消息
            accept = ss.accept();
            //c.开始创建独立线程处理socket
            System.out.println(accept.getRemoteSocketAddress()+"上线了");
            //创建线程类对象
            Runnable srt = new ServiceReaderThread(accept);
            list.add(accept);
            //用线程池执行线程对象
            pool.execute(srt);

        }

    }
}


